#pragma once
#include "connection.hpp"
#include "channel.hpp"
#define ACCEPT_DONE -1
#define ACCEPT_CONTINUE -2
#define ACCEPT_ERR -3
class listenr : public Connection
{
public:
    listenr(int port)
        : _port(port),
          _listensock(std::make_unique<TcpSocket>(port))
    {
        _listensock->BuildTcpSocketMethod(port);
        SetEvent(EPOLLIN | EPOLLET | EPOLLERR | EPOLLHUP); // 设置为关心读事件 和ET的工作模式ET模式下我们要设置文件描述符为非阻塞
        SetNoBlock(_listensock->getfd());
    }
    int GetFd() override
    {
        return _listensock->getfd();
    }
    void RECV() override
    {
        LOG(LogLevel::DEBUG) << "进入我们套接字获取新连接模块";
        // listen套接字如何处理我们的读事件
        InetAddr client;
        while (true)
        {
            int n = _listensock->acceptordie(&client);
            if (n == ACCEPT_ERR)
                break;
            else if (n == ACCEPT_CONTINUE) // 被信号中断
                continue;
            else if (n == ACCEPT_DONE)
                break;
            else
            {
                LOG(LogLevel::DEBUG) << "成功获取一个新连接" << " client:" << client.StringAddr();
                // 把我们的新的fd加入我们的Reactor中
                auto newconnection=std::make_shared<channel>(n, client);
                newconnection->Register(_func);
                GetOwner()->AddConnection(newconnection);
                //紧接着设置我们的回调函数

            }
        }
    }
    void Excepter() override
    {
    }
    void SEND() override
    {
        // todo
    }
    ~listenr() {}
    InetAddr* GetClient() override
    {
        return nullptr;
    }

private:
    int _port;
    std::unique_ptr<Socket> _listensock;
};
